package com.group2.edu.realtime.common.util;

import com.google.common.base.CaseFormat;
import com.group2.edu.realtime.common.constant.Constant;
import org.apache.commons.beanutils.BeanUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 高耀
 * @date 2024/12/2 12:00
 */
public class JdbcUtil {
    /**
     * 创建mysql连接并返回的方法
     */
    public static Connection getConnection() throws Exception {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //创建连接返回
        return DriverManager.getConnection(
                Constant.MYSQL_URL,
                Constant.MYSQL_USER_NAME,
                Constant.MYSQL_PASSWORD
        );
    }

    /**
     * 关闭连接的方法
     */
    public static void closeConnection(Connection conn) throws SQLException {
        conn.close();
    }

    /**
     *  从数据库中查询出结果列表并返回的方法。
     *  可自动将 数据库中的小写下划线字段 转成 对象中的小驼峰属性
     * @param conn mysql连接
     * @param sql 查询语句
     * @param clazz 封装的对象类型
     * @return 返回封装了对象的List
     */
    public static <E> List<E> queryList(Connection conn, String sql, Class<E> clazz) throws Exception {
        //准备一个List集合返回
        ArrayList<E> resultList = new ArrayList<>();
        //执行查询得到结果
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();
        //获取查询结果的元数据，其中存储着结果各字段的信息
        ResultSetMetaData metaData = resultSet.getMetaData();
        //遍历查询结果
        while(resultSet.next()) {
            //使用反射创建一个要求类型的对象
            E obj = clazz.newInstance();
            //给该对象各属性赋值
            for (int i = 1; i <= metaData.getColumnCount(); i++) {
                //先取出字段名并转成小驼峰的格式
                String columnName = metaData.getColumnName(i);
                columnName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, columnName);
                //再从resultSet中取出这字段的值
                Object columnValue = resultSet.getObject(i);
                //使用工具类给对象属性赋值
                BeanUtils.setProperty(obj, columnName, columnValue);
            }
            //将该对象放入List
            resultList.add(obj);
        }
        //释放资源
        resultSet.close();
        preparedStatement.close();
        //最后返回
        return resultList;
    }
}
